package com.orderplus.opshop.core.controller;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.orderplus.opshop.common.util.JsonValidator;
import com.orderplus.opshop.core.data.AbstractExchanger;
import com.orderplus.opshop.web.ApplicationContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.annotation.Resource;
import javax.servlet.http.HttpSession;
import java.net.URLDecoder;

/**
 * Title: 所有Controller的基类，提供基础的方法,包括json格式转换,session获取,dto和entity的转换初始化等
 * Description: Company: Copyright @ 2019 OrderPlus 版权所有
 *
 * @version 1.0 初稿
 * @author: mhj
 * @date: 2019年4月16日上午10:03:33
 */
public abstract class BaseController<DTO, ENTITY, Exchanger extends AbstractExchanger<DTO, ENTITY>> {
	final static Logger _Logger = LoggerFactory.getLogger(BaseController.class);

	protected ObjectMapper objectMapper = new ObjectMapper();

	@Resource
	public Exchanger exchanger;

	public String toJsonStr(Object obj) throws Exception {
		return objectMapper.writeValueAsString(obj);
	}

	/**
	 * @Description: 获取session
	 * @author: 陈志光
	 * @date: 2014年11月20日上午10:32:48
	 */
	public HttpSession getSession() throws Exception {
		return ApplicationContext.getSession();
	}

	/**
	 * Description: jso中文转码
	 *
	 * @throws Exception
	 * @author: maihaojun, 用流输出
	 * @date: 2015年7月7日上午11:11:11
	 */
	public String decoderToJson(String jsonStr) throws Exception {
//		jsonStr包含中文，页面做了转码处理，接收时，也要进行转码编译
		JsonValidator jv = new JsonValidator();
		boolean flag = true;
		int total = 1;
		while (flag) {        //如仍不是json格式，则再次循环转码
			if (total > 5) {
//				如超过5次转码，仍然无法解析，证明该字符串不是json格式，则抛出异常
				throw new Exception("字符无法解析，请检查！");
			}

//			判断是否为json格式，如不是则转转码
			if (!jv.validJson(jsonStr)) {
				jsonStr = URLDecoder.decode(jsonStr, "UTF-8");
			} else {
				flag = false;
			}
			total++;
		}
		return jsonStr;
	}

}
